package com.zm.test;

import com.zm.dao.IUserDao;
import com.zm.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class SecondLevelCache {
    private InputStream in;
    private  SqlSessionFactory factory;

    @Before //用于在测试方法之前执行
    public void init() throws IOException {
        //1.读取配置文件，生成字节输入流
        in= Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory\
        factory=new SqlSessionFactoryBuilder().build(in);

    }
    @After //用于在测试方法之后执行
    public  void destroy() throws IOException {

        in.close();
    }

    /**
     * 二级缓存
     * 它是指mybatis中sqlsessionfactory对象的缓存
     * 由同一个ssqlsessionfactory对象创建的sqlsession共享其缓存
     * 二级缓存的使用步骤：
     * 1.让mybatis框架支持二级缓存（sqlmapconfig中配置）
     * 2。让当前的配置文件支持二级缓存（在IUserDao.xml文件中配置）
     * 3.让当前的操作支持二级缓存（在select标签中配置）
     *
     * 结果为false，为什么？
     * 答：二级缓存中存储的是数据而不是对象，所以对比对象是false，但数据是从缓存当中拿到的
     */
    @Test
    public void testSecondLevelCache(){
        SqlSession sqlSession1 =factory.openSession();
        IUserDao dao1=sqlSession1.getMapper(IUserDao.class);
        User user1=dao1.findById(41);
        System.out.println("////////////////////////////////////////第一次查询/////////////////////////////////////////////////////////");
        System.out.println(user1);

        sqlSession1.close();

        SqlSession sqlSession2 =factory.openSession();
        IUserDao dao2=sqlSession2.getMapper(IUserDao.class);
        User user2=dao2.findById(41);
        System.out.println("////////////////////////////////////////第二次查询/////////////////////////////////////////////////////////");
        System.out.println(user1);
        sqlSession2.close();
        System.out.println("////////////////////////////////////////结果/////////////////////////////////////////////////////////");

        System.out.println(user1==user2);



    }




}
